package logic

import (
	"bluebell/dao/mysql" // 导入 MySQL 数据访问层
	"errors"             // 导入 errors 包，用于创建错误
	"go.uber.org/zap"    // 导入 zap 日志库
)

var (
	// ErrorPostNotExist 帖子不存在错误
	ErrorPostNotExist = errors.New("帖子不存在")
	// ErrorLikeConflict 点赞状态冲突错误 (如果你的业务逻辑会用到此错误，请保留；否则可以删除)
	// ErrorLikeConflict = errors.New("点赞状态冲突")
)

// LikePost 点赞帖子
// 参数：userID - 当前用户ID, postID - 帖子ID (int64类型)
// 返回值：exists - 点赞后状态 (true表示已点赞), err - 错误信息
func LikePost(userID, postID int64) (exists bool, err error) { // 函数签名已修改为直接接收 int64 postID
	// 1. 验证帖子是否存在
	if exists, err := mysql.PostExists(postID); err != nil { // 直接使用 postID
		zap.L().Error("查询帖子是否存在失败",
			zap.Int64("postID", postID), // 日志中也直接使用 int64 postID
			zap.Error(err))
		return false, err
	} else if !exists {
		zap.L().Warn("尝试对不存在的帖子点赞",
			zap.Int64("userID", userID),
			zap.Int64("postID", postID)) // 日志中也直接使用 int64 postID
		return false, ErrorPostNotExist
	}

	// 2. 添加点赞记录
	if err := mysql.AddLike(userID, postID); err != nil { // 直接使用 postID
		zap.L().Error("添加点赞记录失败",
			zap.Int64("userID", userID),
			zap.Int64("postID", postID), // 日志中也直接使用 int64 postID
			zap.Error(err))
		return false, err
	}

	zap.L().Info("用户点赞成功",
		zap.Int64("userID", userID),
		zap.Int64("postID", postID)) // 日志中也直接使用 int64 postID

	// 3. 更新帖子统计量 (假设 RecordPostLike 函数已存在并接收 int64 postID)
	// 如果 RecordPostLike 在其他包中，请确保其函数签名兼容。
	RecordPostLike(postID)
	return true, nil
}

// UnlikePost 取消点赞
// 参数：userID - 当前用户ID, postID - 帖子ID (int64类型)
// 返回值：exists - 取消点赞后状态 (false表示未点赞), err - 错误信息
func UnlikePost(userID, postID int64) (exists bool, err error) { // 函数签名已修改为直接接收 int64 postID
	// 1. 验证帖子是否存在
	if exists, err := mysql.PostExists(postID); err != nil { // 直接使用 postID
		zap.L().Error("查询帖子是否存在失败",
			zap.Int64("postID", postID), // 日志中也直接使用 int64 postID
			zap.Error(err))
		return false, err
	} else if !exists {
		zap.L().Warn("尝试取消不存在的帖子点赞",
			zap.Int64("userID", userID),
			zap.Int64("postID", postID)) // 日志中也直接使用 int64 postID
		return false, ErrorPostNotExist
	}

	// 2. 移除点赞记录
	if err := mysql.RemoveLike(userID, postID); err != nil { // 直接使用 postID
		// 检查是否因为没有点赞记录而导致的错误，如果是则视为成功取消
		if err.Error() == "无相关点赞记录" {
			zap.L().Warn("尝试取消未点赞的帖子",
				zap.Int64("userID", userID),
				zap.Int64("postID", postID)) // 日志中也直接使用 int64 postID
			return false, nil // 返回 false 表示未点赞，且无错误
		}
		zap.L().Error("移除点赞记录失败",
			zap.Int64("userID", userID),
			zap.Int64("postID", postID), // 日志中也直接使用 int64 postID
			zap.Error(err))
		return false, err
	}

	zap.L().Info("用户取消点赞成功",
		zap.Int64("userID", userID),
		zap.Int64("postID", postID)) // 日志中也直接使用 int64 postID

	return false, nil // 返回 false 表示未点赞
}

// ToggleLike 切换点赞状态
// 参数：userID - 当前用户ID, postID - 帖子ID (int64类型)
// 返回值：exists - 切换后状态 (true表示已点赞，false表示未点赞), err - 错误信息
func ToggleLike(userID, postID int64) (exists bool, err error) { // 函数签名已修改为直接接收 int64 postID
	// 1. 验证帖子是否存在
	if exists, err := mysql.PostExists(postID); err != nil { // 直接使用 postID
		zap.L().Error("查询帖子是否存在失败",
			zap.Int64("postID", postID), // 日志中也直接使用 int64 postID
			zap.Error(err))
		return false, err
	} else if !exists {
		zap.L().Warn("尝试切换不存在的帖子点赞状态",
			zap.Int64("userID", userID),
			zap.Int64("postID", postID)) // 日志中也直接使用 int64 postID
		return false, ErrorPostNotExist
	}

	// 2. 切换点赞状态 (假设 mysql.ToggleLike 已经处理好接收 int64 postID)
	exists, err = mysql.ToggleLike(userID, postID) // 直接使用 postID
	if err != nil {
		zap.L().Error("切换点赞状态失败",
			zap.Int64("userID", userID),
			zap.Int64("postID", postID), // 日志中也直接使用 int64 postID
			zap.Error(err))
		return false, err
	}

	if exists {
		zap.L().Info("用户点赞成功",
			zap.Int64("userID", userID),
			zap.Int64("postID", postID)) // 日志中也直接使用 int64 postID
	} else {
		zap.L().Info("用户取消点赞成功",
			zap.Int64("userID", userID),
			zap.Int64("postID", postID)) // 日志中也直接使用 int64 postID
	}

	return exists, nil // 返回最终的点赞状态
}

// CheckLikeExists 检查点赞是否存在
// 参数：userID - 当前用户ID, postID - 帖子ID (int64类型)
// 返回值：liked - 是否已点赞 (true表示已点赞，false表示未点赞), err - 错误信息
func CheckLikeExists(userID, postID int64) (liked bool, err error) { // 函数签名保持不变，因为它已经接收 int64 postID
	liked, err = mysql.LikeExists(userID, postID) // 假设 mysql.LikeExists 已经处理好接收 int64 postID
	if err != nil {
		zap.L().Error("检查点赞存在性失败",
			zap.Int64("userID", userID),
			zap.Int64("postID", postID),
			zap.Error(err))
		return false, err
	}
	return liked, nil
}
